package gob.pgr.main;

import gob.pgr.xml.Departamento;
import gob.pgr.xml.DomXml;
import gob.pgr.xml.JdomXml;
import gob.pgr.xml.Municipio;
import gob.pgr.xml.SalidaXml;
import gob.pgr.xml.Persona;

import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

import org.apache.commons.lang.StringUtils;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class Main {

	public static void main(String[] args) throws Exception {
		List<Persona> listaPersonas = new ArrayList<Persona>();
		Calendar calendar = GregorianCalendar.getInstance();
		
		calendar.set(1962, 9, 2, 0, 0, 0);
		Persona persona = new Persona();
		persona.setPrimerNombre("Charlene");
		persona.setSegundoNombre("Gavin");
		persona.setPrimerApellido("Swanson");
		persona.setSegundoApellido("George");
		persona.setEdad(49);
		persona.setFechaNacimiento(calendar.getTime());
		persona.setEstatura(1.67);
		listaPersonas.add(persona);

		System.out.println("XML utilizando Concatenacion:");
		System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?><personas>" + persona.generarXml() + "</personas>");
		System.out.println(StringUtils.leftPad("", 20, "-"));
		System.out.println("XML utilizando Reflection:");
		System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?><personas>" + persona.generarXml() + "</personas>");
		System.out.println(StringUtils.leftPad("", 20, "-"));
		
		calendar.set(1949, 8, 27, 0, 0, 0);
		persona = new Persona();
		persona.setPrimerNombre("Randi");
		persona.setSegundoNombre("Pablo");
		persona.setPrimerApellido("Hurley");
		persona.setSegundoApellido("Maddox");
		persona.setEdad(62);
		persona.setFechaNacimiento(calendar.getTime());
		persona.setEstatura(1.85);
		listaPersonas.add(persona);

		DomXml domXml = new DomXml();
		String xml = domXml.getXml(listaPersonas);
		System.out.println("XML utilizando Java DOM:\n" + xml);
		
		System.out.println(StringUtils.leftPad("", 20, "-"));
		
		JdomXml jdomXml = new JdomXml();
		xml = jdomXml.getXml(listaPersonas);
		System.out.println("XML utilizando JDOM:\n" + xml);
		
		System.out.println(StringUtils.leftPad("", 20, "-"));
		
		XStream xstream = new XStream(new StaxDriver());
		xstream.autodetectAnnotations(true);
		xstream.alias("personas", List.class);
		xstream.alias("persona", Persona.class);
		xml = xstream.toXML(listaPersonas);
		System.out.println("XML utilizando XSTREAM:\n" + xml);
		
		System.out.println(StringUtils.leftPad("", 20, "-"));
		
		Municipio municipio = new Municipio();
		municipio.setCodigoMunicipio("001");
		municipio.setNombreMunicipio("Santa Tecla");
		
		List<Municipio> municipios = new ArrayList<Municipio>();
		municipios.add(municipio);
		
		Departamento departamento = new Departamento();
		departamento.setCodigoDepartamento("01");
		departamento.setNombreDepartamento("La Libertad");
		departamento.setZona("Central");
		departamento.setMunicipios(municipios);
		
		List<Departamento> departamentos = new ArrayList<Departamento>();
		departamentos.add(departamento);
		
		SalidaXml salidaXml = new SalidaXml();
		salidaXml.setDepartamentos(departamentos);
		xml = generarXml(salidaXml);
		System.out.println("XML utilizando JAXB:\n" + xml);
	}

	private static String generarXml(Object object) {
		String xml = "";
		StringWriter stringWriter = new StringWriter();
		JAXBContext jaxbContext = null;
		try {
			jaxbContext = JAXBContext.newInstance(object.getClass());
			Marshaller marshaller = jaxbContext.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			marshaller.marshal(object, stringWriter);
			xml = stringWriter.toString();
		} catch (Exception e) {
			System.out.println("Error: " + e.getMessage());
		}
		return xml;
	}
	
}
